import axios from 'axios'
import store from '../store'
import { getToken } from '@/utils/auth'
import { Toast } from 'vant'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 60 * 1000, // 请求超时时间
  // withCredentials: true, // axios 写入 cookies
  headers: {
    'Content-Type': 'application/json'
  },
  responseType: 'json'
})

// 声明一个数组用于存储每个ajax请求的取消函数和ajax标识
const pending = []
const _cancelToken = axios.CancelToken
const removePending = ever => {
  for (const p in pending) {
    if (pending[p].u === ever.url + '&' + ever.method) {
      // 当前请求在数组中存在时执行函数体
      pending[p].f() // 执行取消操作
      pending.splice(p, 1) // 把这条记录从数组中移除
    }
  }
}

// request拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['token'] = getToken()
    }
    removePending(config) // 在一个ajax发送前执行一下取消操作
    // config.headers['Content-Type'] = 'application/json'
    config.headers.lang = store.getters.language
    // 这里的ajax标识我是用请求地址&请求方式拼接的字符串
    config.cancelToken = new _cancelToken(c => {
      pending.push({ u: config.url + '&' + config.method, f: c })
    })
    return config
  },
  error => {
    // Do something with request error
    Promise.reject(error)
  }
)

// 请求响应后置拦截
service.interceptors.response.use(
  response => {
    // 在一个ajax响应后再执行一下取消操作，把已经完成的请求从pending中移除
    removePending(response.config)
    const res = response.data
    if (res.status) {
      return res.data
    } else {
      // 处理文件流
      if (response.config.headers.type === 'report') return res
      // token 失效 或者 过期, 清除token
      if (res.code === 2) {
        store.dispatch('user/Loginout').then(() => {
          location.reload()
        })
      }
      // 错误提示， 登录token失效不提示
      if (res.code !== 1) { Toast.fail(res.message) }

      return Promise.reject(res.message)
    }
  },
  error => {
    return Promise.reject(error)
  }
)

export default service
